// このプログラムは 以下の書籍のサンプルを ubuntu で実行できるよう修正したものです。
//    Essential OpenCV Programming with Visual C++ 2008
//    http://www.cutt.co.jp/book/978-4-87783-232-2.html

// コンパイルは
//    gcc -o ex01 ex01.c `pkg-config gtk+-2.0 opencv --cflags --libs`

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <gtk/gtk.h>

// 変数の定義
    GtkWidget* Form1 ; // Form1
    gchar* WIN ="ex01" ; // WIN
    IplImage* img_src ; // img_src
// 関数の定義
    void Form1_Load ( ) { // Form1 - Load
        // WIN - new
            cvNamedWindow( WIN , CV_WINDOW_AUTOSIZE ) ;
    }
    void Form1_FormClosed ( ) { // Form1 - FormClosed
        // WIN - close
            cvDestroyWindow( WIN ) ;
        // img_src - free
            cvReleaseImage( &img_src ) ;
    }
    void Form1_quit ( ) { // Form1 - quit
        gtk_main_quit () ;
        // Form1 - FormClosed ;
            Form1_FormClosed(   ) ;
    }
    void btnLoad_Click ( ) { // btnLoad - Click
        GtkWidget* openFileDialog1 ; { // openFileDialog1 - new
            openFileDialog1 = gtk_file_chooser_dialog_new(
                "load image" , GTK_WINDOW( Form1 ) ,
                GTK_FILE_CHOOSER_ACTION_OPEN ,
                GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL ,
                GTK_STOCK_OPEN , GTK_RESPONSE_ACCEPT ,
                NULL
            );
            // openFileDialog1 - show
                gtk_widget_show_all( openFileDialog1 ) ;
        }
        gint openFileDialog1_result ; { // openFileDialog1 - result
            openFileDialog1_result = gtk_dialog_run(
                GTK_DIALOG( openFileDialog1 )
            ) ;
            // if( ! openFileDialog1 - result OK ) { openFileDialog1 - free ; return ; }
                if( ! ( openFileDialog1_result == GTK_RESPONSE_ACCEPT ) ) { gtk_widget_destroy( openFileDialog1 ) ; ; return ; }
        }
        gchar* fname ; { // fname - from openFileDialog1
            fname = gtk_file_chooser_get_filename(
                GTK_FILE_CHOOSER( openFileDialog1 )
            ) ;
            // openFileDialog1 - free
                gtk_widget_destroy( openFileDialog1 ) ;
        }
        // img_src - load fname
            img_src = cvLoadImage( fname ,
                CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR
            ) ;
            // img_src - show
                cvShowImage( WIN , img_src ) ;
            // fname -free
                g_free( fname ) ;
        // 
    }
    void btnGray_Click ( ) { // btnGray - Click
        IplImage* img_gray ; { // img_gray - new
            
            // img_gray - from img_src
                img_gray = cvCreateImage(
                    cvGetSize( img_src ) , IPL_DEPTH_8U , 1
                ) ;
                cvCvtColor( img_src , img_gray , CV_BGR2GRAY ) ;
            // img_gray - show
                cvShowImage( WIN , img_gray ) ;
        }
        // img_gray - free
            cvReleaseImage( &img_gray ) ;
        // 
    }
    void btnReset_Click ( ) { // btnReset - Click
        // img_src - show
            cvShowImage( WIN , img_src ) ;
    }
    // 

int main ( int argc , char* argv[] ) {
    gtk_init ( &argc , &argv ) ;
    // 処理
        // Form1 - new
            Form1 = gtk_window_new( GTK_WINDOW_TOPLEVEL ) ;
            gtk_window_set_title ( GTK_WINDOW( Form1 ) , "Form1" ) ;
            gtk_widget_set_size_request( Form1 , 160 , 80 ) ;
            g_signal_connect( G_OBJECT( Form1 ) ,
                "destroy" , G_CALLBACK( Form1_quit ) , NULL
            ) ;
            GtkWidget* vbox ; { // Form1 - vbox
                vbox = gtk_vbox_new( FALSE , 3 ) ;
                gtk_container_add( GTK_CONTAINER( Form1 ) , vbox ) ;
                gtk_container_set_border_width( GTK_CONTAINER( vbox ) , 6 ) ;
            }
            GtkWidget* hbox1 ; { // Form1 - hbox1
                hbox1 = gtk_hbox_new( FALSE , 5 ) ;
                gtk_box_pack_start( GTK_BOX( vbox ) , hbox1 , TRUE , FALSE , 2 ) ;
                GtkWidget* btnLoad ; { // Form1 - btnLoad
                    btnLoad = gtk_button_new_with_label( "画像読込" ) ;
                    gtk_box_pack_start( GTK_BOX( hbox1 ) , btnLoad , FALSE , FALSE , 6 ) ;
                    g_signal_connect( G_OBJECT( btnLoad ) , "clicked" ,
                        G_CALLBACK( btnLoad_Click ) , NULL
                    ) ;
                }
            }
            GtkWidget* hbox2 ; { // Form1 - hbox2
                hbox2 = gtk_hbox_new( FALSE , 0 ) ;
                gtk_box_pack_start( GTK_BOX( vbox ) , hbox2 , TRUE , FALSE , 2 ) ;
                GtkWidget* btnGray ; { // Form1 - btnGray
                    btnGray = gtk_button_new_with_label( " モノクロ " ) ;
                    gtk_box_pack_start( GTK_BOX( hbox2 ) , btnGray , FALSE , FALSE , 6 ) ;
                    g_signal_connect( G_OBJECT( btnGray ) , "clicked" ,
                        G_CALLBACK( btnGray_Click ) , NULL
                    ) ;
                }
                GtkWidget* btnReset ; { // Form1 - btnReset
                    btnReset = gtk_button_new_with_label( "元に戻す" ) ;
                    gtk_box_pack_start( GTK_BOX( hbox2 ) , btnReset , FALSE , FALSE , 6 ) ;
                    g_signal_connect( G_OBJECT( btnReset ) , "clicked" ,
                        G_CALLBACK( btnReset_Click ) , NULL
                    ) ;
                }
            }
            // Form1 - Load ;
                Form1_Load(   ) ;
        // Form1 - run
            gtk_widget_show_all( Form1 ) ;
            gtk_main() ;
        // 
    return 0 ;
}

